
// 使用对象(实例)字面量创建一个Object实例
let p = {
    show(){
        console.log( '现在是:' + new Date().toISOString() );
    }
}

// 通过 p.constructor 可以明确 p 所指向的实例是用哪个构造方法创建的
console.log( p.constructor );

// 使用 Object.create 方法创建一个新的Object实例
let x = Object.create( p );
// 这个新创建的Object实例的原型是参数对应的对象
console.log( Object.getPrototypeOf( x ) === p ) ; // true
console.log( x.__proto__ === p ); // true

x.show(); // 调用从原型上继承的方法

// 通过 x.constructor 可以明确 x 所指向的实例是用哪个构造方法创建的
console.log( x.constructor );

console.log( '- - '.repeat( 10 ) );

// 将自身以及从原型链继承的所有可枚举属性列出
for (const key in x) {
    console.log( key );
}

console.log( '- - '.repeat( 10 ) );

console.log( x.hasOwnProperty( 'show' ) ); // false
console.log( x.propertyIsEnumerable( 'show' ) ); // false

console.log( '- - '.repeat( 10 ) );

Object.defineProperty( x , 'welcome' , {
    value(){
        console.log( '欢迎来到地球' );
    },
    enumerable: true ,
    configurable: false ,
    writable: false
} );

console.log( x.hasOwnProperty( 'welcome' ) ); // true
console.log( x.propertyIsEnumerable( 'welcome' ) ); // true